package com.ymfjc.circle.server.config.websocket;

import com.alibaba.nacos.common.utils.CollectionUtils;
import org.springframework.stereotype.Component;

import javax.websocket.HandshakeResponse;
import javax.websocket.server.HandshakeRequest;
import javax.websocket.server.ServerEndpointConfig;
import java.util.List;
import java.util.Map;

/**
 *  WebSocket继承类
 */
@Component
public class WebSocketServerConfig extends ServerEndpointConfig.Configurator {
    /**
     * 方法用于检查 WebSocket 连接请求的 Origin 头。Origin 头通常用于浏览器发送的跨域请求中，表示请求源的域。
     */
    @Override
    public boolean checkOrigin(String originHeaderValue) {
        //是否放行，可以在权限过滤
        //checkOrigin 方法简单地返回 true，表示所有的 WebSocket 连接请求都被允许，不进行限制。
        return true;
    }

    /**
     * 功能：modifyHandshake 方法用于在 WebSocket 握手阶段对请求和响应进行修改。在 WebSocket 连接建立之前，客户端与服务器会进行一次 HTTP 握手，这个方法就是用来处理握手过程中的一些定制化操作。
     */
    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        /**
         * 如果 erp 参数存在（即不为空），将 erp 参数值放入 ServerEndpointConfig 的用户属性中（sec.getUserProperties().put("erp", erpList.get(0))）。这里的 userProperties 是一个可以存储会话级别的用户数据的地方，可以用来传递一些与当前 WebSocket 会话相关的信息，例如用户的身份、权限等。在此处，erp 参数可能代表了一个特定的业务相关信息，如企业或系统标识，传递到 WebSocket 会话中。
          */
        Map<String, List<String>> parameterMap = request.getParameterMap();
        List<String> erpList = parameterMap.get("erp");
        if(!CollectionUtils.isEmpty(erpList)){
            sec.getUserProperties().put("erp", erpList.get(0));
        }
    }

}
